import axios from 'axios'
import { Message } from 'element-ui'

// 创建 axios 实例
const service = axios.create({
  baseURL: 'http://127.0.0.1:4523/m1/5702810-5383946-default', // 替换为你的 API 基础 URL
  timeout: 5000 // 请求超时时间
})

let max = 3
let map = {}
let timer = 1000
let isMessageShown = false

// 根据后端返回的code进行 登录 人机校验 二次确认等操作
let statusMap = {}
// 处理事件统一 包含多个请求的操作
const pendingHandler = []

// 策略模式处理
export function registerFn(status, fn) {
  statusMap[status] = fn
}

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么，例如添加请求头
    const token = localStorage.getItem('token')
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  error => {
    // 处理请求错误
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  async response => {
    // 数据请求成功 直接将数据返回
    if (response.config.params?.a === 1) {
      return Promise.resolve(response)
    }

    // 策略模式处理多种情况
    const status = response.data.status

    const handler = statusMap[status]
    console.log(handler)

    pendingHandler[status] = pendingHandler[status] || []
    let res
    try {
      if (pendingHandler.length > 0) {
        res = new Promise((resolve, reject) => {
          pendingHandler[status].push({ resolve, reject })
        })
      } else {
        if (handler) {
          res = await handler()
          pendingHandler[status].forEach(({ resovle }) => {
            resovle(res)
          })
        } else {
          pendingHandler[status].forEach(({ reject }) => {
            reject(res)
          })
          return Promise.reject()
        }
      }
    } catch (e) {}
    const type = res
    if (type === 1) {
      return service(response.config)
    }
  },
  async error => {
    // 默认重新进行请求 3 次
    const hash = btoa(JSON.stringify(error.config))
    let count = map[hash] || 0
    if (count < max) {
      count++
      map[hash] = count
      return new Promise(resolve => {
        setTimeout(() => {
          resolve(service(error.config))
        }, timer)
      })
    } else {
      // 清空三次错误 保证下次请求依旧会重试3次
      delete map[hash]
      // 保证只有一个弹框
      if (!isMessageShown) {
        isMessageShown = true
        Message.error('请求失败，请检查网络或联系管理员')

        // 3秒后重置标志
        setTimeout(() => {
          isMessageShown = false
        }, 3000)
      }
      // 处理响应错误
      // console.error('响应错误:', error)
      // return Promise.reject(error)
    }
  }
)

// 封装 get 请求
export const get = (url, params = {}) => {
  return service.get(url, { params })
}

// 封装 post 请求
export const post = (url, data = {}) => {
  return service.post(url, data)
}

// 封装 put 请求
export const put = (url, data = {}) => {
  return service.put(url, data)
}

// 封装 delete 请求
export const del = (url, params = {}) => {
  return service.delete(url, { params })
}
